package cn.vconinfo.lims.delivery.config;

import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
public class ExecutorConfig {

//    @Bean
//    public ThreadPoolTaskExecutor getAsyncExecutor() {
//        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//        // 配置核心线程数
//        executor.setCorePoolSize(10);
//        // 配置最大线程数
//        executor.setMaxPoolSize(100);
//        // 配置队列大小
//        executor.setQueueCapacity(200);
//        // 等待任务在关机时完成--表明等待所有线程执行完
//        executor.setWaitForTasksToCompleteOnShutdown(true);
//        // 等待时间 （默认为0，此时立即停止），并没等待xx秒后强制停止
//        executor.setAwaitTerminationSeconds(120);
//        // 配置线程池中的线程的名称前缀
//        executor.setThreadNamePrefix("async-service-");
//        // rejection-policy：当pool已经达到max size的时候，如何处理新任务
//        // CALLER_RUNS：不在新线程中执行任务，而是有调用者所在的线程来执行
//        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//        // 执行初始化
//        executor.initialize();
//        return executor;
//    }
    

    @Bean
    public ThreadPoolTaskScheduler scheduledExecutorService() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        // 等待任务在关机时完成--表明等待所有线程执行完
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        // 等待时间 （默认为0，此时立即停止），并没等待xx秒后强制停止
        scheduler.setAwaitTerminationSeconds(120);
        // 配置线程池中的线程的名称前缀
        scheduler.setThreadNamePrefix("scheduled-thread-");
        // rejection-policy：当pool已经达到max size的时候，如何处理新任务
        // CALLER_RUNS：不在新线程中执行任务，而是有调用者所在的线程来执行
        scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 执行初始化
        scheduler.initialize();
        return scheduler;
    }

    /**
     *  请求字符规范
     *
     * @return
     */
    @Bean
    public TomcatServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((Connector connector) -> {
            connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
            connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
        });
        return factory;
    }

}
